import Vue from 'vue'
import Router from 'vue-router'
import { Dialog, Toast } from 'vant'
import { get, post } from '@/assets/service/http'
Vue.use(Router)

/**
 * meta中特殊参数说明
 * @param unAuthorization // 不用走网页授权获取openid
 * @param setMenuAndShareInPage // 在路由对应的页面中，设置微信工具菜单的显隐和分享
 * @param showAllMenu // 展示所有微信工具菜单
 * @param showMenuList // 需要展示的微信工具菜单
 * @param forbitShare // 禁止自定义分享
 * @param shareInfo // 分享的配置信息 title、desc、link、imgUrl
 */
const route = new Router({
  mode: 'history',
  base: `${process.env.VUE_APP_BASE_URL}${process.env.VUE_APP_VERSION}/`,
  routes: [
    {
      path: '/',
      redirect: '/home'
    },
    {
      path: '/index',
      name: 'index',
      component: () => import('@/views/index')
    },
    {
      path: '/home',
      name: 'meetingHome',
      component: () => import('@/views/meeting/home'),
      meta: {
        title: '会议主页',
        setMenuAndShareInPage: true
      }
    },
    // {
    //   path: '/sign',
    //   name: 'meetingSign',
    //   component: () => import('@/views/meeting/sign'),
    //   meta: {
    //     title: '签到',
    //     setMenuAndShareInPage: true
    //   }
    // },
    // {
    //   path: '/signResult',
    //   name: 'signResult',
    //   component: () => import('@/views/meeting/signResult'),
    //   meta: {
    //     title: '签到结果',
    //     forbitShare: true
    //   }
    // },
    {
      path: '/voteSurveyList',
      name: 'voteSurveyList',
      component: () => import('@/views/meeting/voteSurveyList'),
      meta: {
        title: '投票调研',
        showMenuList: [],
        forbitShare: true
      }
    },
    {
      path: '/questionList',
      name: 'questionList',
      component: () => import('@/views/meeting/questionList'),
      meta: {
        title: '我的提问',
        showMenuList: [],
        forbitShare: true
      }
    },
    {
      path: '/questionScreen',
      name: 'questionScreen',
      component: () => import('@/views/meeting/questionScreen'),
      meta: {
        title: '提问上墙',
        showMenuList: [],
        forbitShare: true
      }
    },
    {
      path: '/commentList',
      name: 'commentList',
      component: () => import('@/views/meeting/commentList'),
      meta: {
        title: '我的评论',
        showMenuList: [],
        forbitShare: true
      }
    },
    {
      path: '/personCenter',
      name: 'meetingPersonCenter',
      component: () => import('@/views/meeting/personCenter'),
      meta: {
        title: '会议中心',
        showMenuList: [],
        forbitShare: true
      }
    },
    {
      path: '/meetingList/:type',
      name: 'meetingList',
      component: () => import('@/views/meeting/list'),
      meta: {
        title: '会议列表',
        showMenuList: [],
        forbitShare: true
      }
    },
    {
      path: '*',
      name: 'notFound',
      component: () => import('@/views/not_found')
    }
  ]
})

/**
 * 通过sessionId获取全局信息（这里是企微环境）
 * 例1：公众号环境，通过sessionId获取appid
 * 例2：企业号环境，通过sessionId获取corpId和agentId
 */
let getGlobalInfo = (to) => {
  return new Promise((resolve, reject) => {
    // 判断当前应用的运行环境
    if (!sessionStorage.getItem('userAgent')) {
      let vue = new Vue()
      vue.checkUserAgent()
    }
    // 本地环境，获取模拟数据
    if (process.env.NODE_ENV === 'development') {
      // sessionStorage.setItem('corpId', 'wwb61d1788cf650922')
      // sessionStorage.setItem('agentId', '1000013')
      sessionStorage.setItem('userId', 'BaMei')
      // sessionStorage.setItem('userId', 'will')
      // sessionStorage.setItem('openid', 'oYleiwU7THlKBUZxGN08i9KfHltg') // 企业号openid-好运来-朱敏宏
      // sessionStorage.setItem('openid', 'oYleiweVMSartFSgk704bO2oR6dw') // 企业号openid-好运来-李影
      // sessionStorage.setItem('openid', '58932458947398796436') // 企业号openid-好运来-随机
    }
    /**
     * 【注】由于属于多个应用的H5之间会互相跳转，所以必须保证当前全局参数（如sessionId、agentId）始终与对应应用一致
     * 如果地址栏上有sessionId参数，则与本地缓存中的sessionId比较
     * 如果不相同，就清空所有相关全局参数，重新获取
     */
    if (to.query && to.query.sessionId) {
      if (sessionStorage.getItem('sessionId') !== to.query.sessionId) {
        sessionStorage.removeItem('sessionId')
        sessionStorage.removeItem('agentId')
        sessionStorage.removeItem('corpId')
        sessionStorage.removeItem('gotGlobalData')
      }
    }
    // 如果有应用id执行下一步，否则进行获取
    if (sessionStorage.getItem('agentId')) {
      resolve('获取企微信息（corpId和agentId）成功')
    } else {
      if (to.query && to.query.sessionId) {
        sessionStorage.setItem('sessionId', to.query.sessionId)
        let url = `/session`
        let param = {
          psid: to.query.sessionId
        }
        get(url, param).then(res => {
          if (res.code === 200 && res.data) {
            sessionStorage.setItem('corpId', res.data.corpId)
            sessionStorage.setItem('agentId', res.data.agentId)
            resolve('获取企微信息（corpId和agentId）成功')
          } else {
            Toast({
              message: res.message
            })
            reject(new Error('获取企微信息（corpId和agentId）失败'))
          }
        })
      } else {
        reject(new Error('获取企微信息（corpId和agentId）失败'))
      }
    }
  })
}

// 获取当前路径上的code，解决用户离开页面需要返回两次的问题
let checkRouteQuery = (to, cb) => {
  let vue = new Vue()
  if (to?.query?.code && !sessionStorage.getItem('code')) {
    sessionStorage.setItem('code', to.query.code)
    // 此操作用于优化 在手机端网页授权后，解决用户离开页面需要返回两次的问题
    if (vue.checkMobile() && !sessionStorage.getItem('isCpMeetingCode')) {
      sessionStorage.setItem('isCpMeetingCode', true)
      history.go(-1)
    } else {
      if (cb && typeof cb === 'function') {
        cb()
      }
    }
  } else {
    sessionStorage.removeItem('isCpMeetingCode')
    if (cb && typeof cb === 'function') {
      cb()
    }
  }
}

// 处理没有获取到
let handleNoUserId = (res) => {
  // // 如果是微信环境，显示企业号引导关注二维码
  // if (sessionStorage.getItem('userAgent') === 'wechat') {
  // // if (sessionStorage.getItem('userAgent') === 'normal') {
  //   window.eventBus.$emit('showCorpQr')
  // } else {
  //   // 如果没有userId, 但已经进行过网页授权，则表示非企业微信环境或非企业用户
  //   window.eventBus.$emit('showVisitLimit', '非企业成员无法访问')
  // }
  if (res && res.code) {
    switch (res.code) {
      // case 43004:
      //   window.eventBus.$emit('showVisitLimit', '需要成员使用微信登录企业微信或者关注微信插件')
      //   break
      case 50002: // 成员不在权限范围
      case 60011: // 指定的成员/部门/标签参数无权限
      case 60021: // userid不在应用可见范围内
      case 60217: // 当前操作者无权限，操作者需要授权或者在可见范围内
      case 92000: // 成员不在应用可见范围之内
      case 301002: // 无权限操作指定的应用
      case 640004: // 无权限访问
      case 660003: // userid不在应用的可见范围
        // 微信打开时需要手动拦截不在应用可见范围内的成员，企微打开时直接在授权接口拦截
        window.eventBus.$emit('showVisitLimit', '成员不在应用可见范围')
        break
      default:
        window.eventBus.$emit('showVisitLimit', '非企业成员无法访问')
        break
    }
  } else {
    window.eventBus.$emit('showVisitLimit', '非企业成员无法访问')
  }
}

/**
 * 校验是否授权
 * 企微的网页授权用于获取userId
 */
let checkAuth = () => {
  return new Promise((resolve, reject) => {
    // 获取到userid，直接进行后续操作
    if (sessionStorage.getItem('userId')) {
      // // 防止pc端浏览器缓存code导致页面无法访问的问题
      // sessionStorage.removeItem('code')
      resolve()
    } else {
      // 如果没有userId, 但有code，说明已经进行过网页授权
      if (sessionStorage.getItem('code')) {
        /**
         * 通过code获取userId或者openid
         * 用户是企业成员则返回userId
         * 用户不是企业成员则返回openid，这时需要通过openid换取userId
         */
        let url = `/v2/cp/auth/${sessionStorage.getItem('corpId')}/${sessionStorage.getItem('agentId')}/code/userInfo`
        let params = {
          code: sessionStorage.getItem('code')
        }
        get(url, params).then(res => {
          if (res.code === 200) {
            if (res.data.userId) {
              sessionStorage.setItem('userId', res.data.userId)
              sessionStorage.removeItem('code')
              resolve()
            } else if (res.data.openid && sessionStorage.getItem('userAgent') === 'wechat') {
              sessionStorage.setItem('openid', res.data.openid)
              // 通过openid获取userId
              let vue = new Vue()
              let url = `${vue.SERVICE_PORTAL}/cp/convert/userId`
              let param = {
                agentId: sessionStorage.getItem('agentId'),
                openid: sessionStorage.getItem('openid')
              }
              post(url, param).then(res => {
                if (res.code === 200 && res.data) {
                  sessionStorage.setItem('userId', res.data)
                  sessionStorage.removeItem('code')
                  resolve()
                } else {
                  Toast({
                    message: res.message
                  })
                  handleNoUserId(res)
                }
              }).catch((e) => {
                console.log('通过openid获取userId失败 e: ', e)
                handleNoUserId(e)
              })
            } else {
              handleNoUserId()
            }
          } else {
            Toast({
              message: res.message
            })
            console.log('通过code获取userId或者openid失败')
            handleNoUserId(res.code)
          }
        }).catch(err => {
          console.log('通过openid获取userId失败 e: ', err)
          handleNoUserId(err)
          // reject(err)
        })
      } else {
        let pagePath = encodeURIComponent(`${location.href}`)
        let url = `/v2/cp/auth/${sessionStorage.getItem('corpId')}/${sessionStorage.getItem('agentId')}/oauth2Url`
        let param = {
          targetUrl: pagePath
        }
        get(url, param, {}).then(res => {
          if (res.code === 200) {
            let url = res.data.url
            location.href = url
            // vue.console('get_oauth2_url: ', url)
          } else {
            Toast({
              message: res.message
            })
          }
        })
      }
    }
  })
}

/**
 * 获取全局参数
 */
let getGlobalData = (to, next) => {
  // 如果已有全局参数，继续向下执行
  if (sessionStorage.getItem('gotGlobalData')) {
    next()
  } else {
    Promise.all([
      getUserInfo()
    ]).then(() => {
      sessionStorage.setItem('gotGlobalData', true)
      next()
    }).catch(err => {
      Toast({
        message: err.message || '获取全局参数失败'
      })
    })
  }
}

/**
 * 获取用户信息
 */
let getUserInfo = () => {
  return new Promise((resolve, reject) => {
    // 如果没有拿到 userId
    if (!sessionStorage.getItem('userId')) {
      sessionStorage.setItem('cpUserName', '')
      sessionStorage.setItem('cpUserMobile', '')
      sessionStorage.setItem('cpUserAvatar', '')
      return resolve('获取企微用户信息成功')
    }
    let url = `/portal/cp/${sessionStorage.getItem('corpId')}/${sessionStorage.getItem('userId')}`
    get(url).then(res => {
      if (res.code === 200) {
        if (res.data) {
          sessionStorage.setItem('cpUserName', res.data.name)
          sessionStorage.setItem('cpUserMobile', res.data.mobile)
          sessionStorage.setItem('cpUserAvatar', res.data.avatar)
        } else {
          sessionStorage.setItem('cpUserName', '')
          sessionStorage.setItem('cpUserMobile', '')
          sessionStorage.setItem('cpUserAvatar', '')
        }
        resolve('获取企微用户信息成功')
      } else {
        Toast({
          message: res.message
        })
        reject(new Error('获取企微用户信息失败'))
      }
    })
  })
}

route.beforeEach((to, from, next) => {
  document.title = to.meta && to.meta.title ? to.meta.title : ''
  getGlobalInfo(to).then(() => {
    checkRouteQuery(to, () => {
      checkAuth().then(() => {
        getGlobalData(to, next)
      })
    })
  }).catch(err => {
    console.log(err)
    Toast({
      message: err
    })
  })
})

route.afterEach((to, from) => {
  setTimeout(() => {
    let vue = new Vue()
    // 如果该页面不需要单独设置 微信工具菜单显隐 和 设置分享
    if (!to.meta.setMenuAndShareInPage) {
      let param = {}
      // 是否显示所有微信工具菜单
      if (to.meta.showAllMenu) {
        param.showAllMenu = to.meta.showAllMenu
      }
      // 显示微信工具菜单列表
      if (to.meta.showMenuList) {
        param.showMenuList = to.meta.showMenuList
      }
      // 是否禁止自定义分享
      if (to.meta.forbitShare) {
        param.forbitShare = to.meta.forbitShare
      }
      // 分享配置参数
      if (to.meta.shareInfo) {
        param.shareInfo = to.meta.shareInfo
      }
      vue.setToolMenuAndShare(param)
    }
  }, 300)
  Toast.clear()
  Dialog.close()
})
export default route
